asyncio ๋๊ธฐํ ๊ธฐ๋ณธ ์์: ์ ๊ธ, ์ธ๋งํฌ์ด ๋ฐ ์ด๋ฒคํธ์ ๋ํ ์ข ํฉ ๊ฐ์ด๋์ ๋๋ค. Python์์ ๋์ ํ๋ก๊ทธ๋๋ฐ์ ํจ๊ณผ์ ์ผ๋ก ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ์์๋ณด์ธ์.
Asyncio ๋๊ธฐํ: ์ ๊ธ, ์ธ๋งํฌ์ด ๋ฐ ์ด๋ฒคํธ ๋ง์คํฐํ๊ธฐ
Python์ ๋น๋๊ธฐ ํ๋ก๊ทธ๋๋ฐ์ asyncio
๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํตํด ํจ์จ์ ์ผ๋ก ๋์ ์์
์ ์ฒ๋ฆฌํ ์ ์๋ ๊ฐ๋ ฅํ ํจ๋ฌ๋ค์์ ์ ๊ณตํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ฌ๋ฌ ์ฝ๋ฃจํด์ด ๊ณต์ ๋ฆฌ์์ค์ ๋์์ ์ก์ธ์คํ ๋ ๊ฒฝ์ ์กฐ๊ฑด์ ๋ฐฉ์งํ๊ณ ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ์ ๋ณด์ฅํ๋ ค๋ฉด ๋๊ธฐํ๊ฐ ์ค์ํฉ๋๋ค. ์ด ์ข
ํฉ ๊ฐ์ด๋์์๋ asyncio
์์ ์ ๊ณตํ๋ ๊ธฐ๋ณธ ๋๊ธฐํ ๊ธฐ๋ณธ ์์์ธ ์ ๊ธ, ์ธ๋งํฌ์ด ๋ฐ ์ด๋ฒคํธ๋ฅผ ์ดํด๋ด
๋๋ค.
๋๊ธฐํ์ ํ์์ฑ ์ดํด
๋๊ธฐ์ ๋จ์ผ ์ค๋ ๋ ํ๊ฒฝ์์๋ ์์ ์ด ์์ฐจ์ ์ผ๋ก ์คํ๋์ด ๋ฆฌ์์ค ๊ด๋ฆฌ๊ฐ ๊ฐ๋จํฉ๋๋ค. ๊ทธ๋ฌ๋ ๋น๋๊ธฐ ํ๊ฒฝ์์๋ ์ฌ๋ฌ ์ฝ๋ฃจํด์ด ์ ์ฌ์ ์ผ๋ก ๋์์ ์คํ๋์ด ์คํ ๊ฒฝ๋ก๊ฐ ์๊ฐ๋ฆด ์ ์์ต๋๋ค. ์ด๋ฌํ ๋์์ฑ์ ์ฝ๋ฃจํด์ด ๊ณต์ ๋ฆฌ์์ค์ ์ก์ธ์คํ๊ณ ์์ ํ๋ ์์ธกํ ์ ์๋ ์์์ ๋ฐ๋ผ ์์ ๊ฒฐ๊ณผ๊ฐ ๋ฌ๋ผ์ง๋ ๊ฒฝ์ ์กฐ๊ฑด์ ๊ฐ๋ฅ์ฑ์ ๋์ ํฉ๋๋ค.
๊ฐ๋จํ ์: ๋ ๊ฐ์ ์ฝ๋ฃจํด์ด ๊ณต์ ์นด์ดํฐ๋ฅผ ์ฆ๊ฐ์ํค๋ ค๊ณ ์๋ํฉ๋๋ค. ์ ์ ํ ๋๊ธฐํ ์์ด๋ ๋ ์ฝ๋ฃจํด ๋ชจ๋ ๋์ผํ ๊ฐ์ ์ฝ๊ณ ๋ก์ปฌ์์ ์ฆ๊ฐ์ํจ ๋ค์ ๊ฒฐ๊ณผ๋ฅผ ๋ค์ ์ธ ์ ์์ต๋๋ค. ์ต์ข ์นด์ดํฐ ๊ฐ์ด ์๋ชป๋ ์ ์์ผ๋ฉฐ ํ๋์ ์ฆ๊ฐ๋ถ์ด ์์ค๋ ์ ์์ต๋๋ค.
๋๊ธฐํ ๊ธฐ๋ณธ ์์๋ ๊ณต์ ๋ฆฌ์์ค์ ๋ํ ์ก์ธ์ค๋ฅผ ์กฐ์ ํ๋ ๋ฉ์ปค๋์ฆ์ ์ ๊ณตํ์ฌ ํ ๋ฒ์ ํ๋์ ์ฝ๋ฃจํด๋ง ์ฝ๋์ ์ค์ํ ์น์ ์ ์ก์ธ์คํ๊ฑฐ๋ ์ฝ๋ฃจํด์ด ์งํํ๊ธฐ ์ ์ ํน์ ์กฐ๊ฑด์ด ์ถฉ์กฑ๋๋๋ก ํฉ๋๋ค.
Asyncio ์ ๊ธ
asyncio.Lock
์ ์ํธ ๋ฐฐ์ ์ ๊ธ(mutex) ์ญํ ์ ํ๋ ๊ธฐ๋ณธ ๋๊ธฐํ ๊ธฐ๋ณธ ์์์
๋๋ค. ํ ๋ฒ์ ํ๋์ ์ฝ๋ฃจํด๋ง ์ ๊ธ์ ํ๋ํ๋๋ก ํ์ฉํ์ฌ ์ ๊ธ์ด ํด์ ๋ ๋๊น์ง ๋ค๋ฅธ ์ฝ๋ฃจํด์ด ๋ณดํธ๋ ๋ฆฌ์์ค์ ์ก์ธ์คํ์ง ๋ชปํ๋๋ก ํฉ๋๋ค.
์ ๊ธ ์๋ ๋ฐฉ์
์ ๊ธ์๋ ์ ๊น ๋ฐ ์ ๊ธ ํด์ ์ ๋ ๊ฐ์ง ์ํ๊ฐ ์์ต๋๋ค. ์ฝ๋ฃจํด์ ์ ๊ธ์ ํ๋ํ๋ ค๊ณ ์๋ํฉ๋๋ค. ์ ๊ธ์ด ํด์ ๋ ๊ฒฝ์ฐ ์ฝ๋ฃจํด์ ์ฆ์ ์ ๊ธ์ ํ๋ํ๊ณ ์งํํฉ๋๋ค. ์ ๊ธ์ด ์ด๋ฏธ ๋ค๋ฅธ ์ฝ๋ฃจํด์ ์ํด ์ ๊ธด ๊ฒฝ์ฐ ํ์ฌ ์ฝ๋ฃจํด์ ์คํ์ ์ผ์ ์ค๋จํ๊ณ ์ ๊ธ์ด ์ฌ์ฉ ๊ฐ๋ฅํด์ง ๋๊น์ง ๊ธฐ๋ค๋ฆฝ๋๋ค. ์์ ์ฝ๋ฃจํด์ด ์ ๊ธ์ ํด์ ํ๋ฉด ๋๊ธฐ ์ค์ธ ์ฝ๋ฃจํด ์ค ํ๋๊ฐ ๊นจ์ด๋ ์ก์ธ์ค ๊ถํ์ด ๋ถ์ฌ๋ฉ๋๋ค.
Asyncio ์ ๊ธ ์ฌ์ฉ
๋ค์์ asyncio.Lock
์ฌ์ฉ์ ๋ณด์ฌ์ฃผ๋ ๊ฐ๋จํ ์์
๋๋ค.
import asyncio
async def safe_increment(lock, counter):
async with lock:
# Critical section: only one coroutine can execute this at a time
current_value = counter[0]
await asyncio.sleep(0.01) # Simulate some work
counter[0] = current_value + 1
async def main():
lock = asyncio.Lock()
counter = [0]
tasks = [safe_increment(lock, counter) for _ in range(10)]
await asyncio.gather(*tasks)
print(f"Final counter value: {counter[0]}")
if __name__ == "__main__":
asyncio.run(main())
์ด ์์์ safe_increment
๋ ๊ณต์ counter
์ ์ก์ธ์คํ๊ธฐ ์ ์ ์ ๊ธ์ ํ๋ํฉ๋๋ค. async with lock:
๋ฌธ์ ๋ธ๋ก์ ๋ค์ด๊ฐ ๋ ์๋์ผ๋ก ์ ๊ธ์ ํ๋ํ๊ณ ์์ธ๊ฐ ๋ฐ์ํ๋๋ผ๋ ์ข
๋ฃํ ๋ ์ ๊ธ์ ํด์ ํ๋ ์ปจํ
์คํธ ๊ด๋ฆฌ์์
๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ์ค์ํ ์น์
์ด ํญ์ ๋ณดํธ๋ฉ๋๋ค.
์ ๊ธ ๋ฉ์๋
acquire()
: ์ ๊ธ์ ํ๋ํ๋ ค๊ณ ์๋ํฉ๋๋ค. ์ ๊ธ์ด ์ด๋ฏธ ์ ๊ธด ๊ฒฝ์ฐ ์ฝ๋ฃจํด์ ํด์ ๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฝ๋๋ค. ์ ๊ธ์ด ํ๋๋๋ฉดTrue
๋ฅผ ๋ฐํํ๊ณ , ์๊ฐ ์ด๊ณผ๊ฐ ์ง์ ๋์๊ณ ์๊ฐ ์ด๊ณผ ๋ด์ ์ ๊ธ์ ํ๋ํ ์ ์์ผ๋ฉดFalse
๋ฅผ ๋ฐํํฉ๋๋ค.release()
: ์ ๊ธ์ ํด์ ํฉ๋๋ค. ์ ๊ธ์ ํด์ ํ๋ ค๊ณ ์๋ํ๋ ์ฝ๋ฃจํด์ด ํ์ฌ ์ ๊ธ์ ๋ณด์ ํ๊ณ ์์ง ์์ผ๋ฉดRuntimeError
๋ฅผ ๋ฐ์์ํต๋๋ค.locked()
: ์ ๊ธ์ด ํ์ฌ ์ผ๋ถ ์ฝ๋ฃจํด์ ์ํด ๋ณด์ ๋์ด ์์ผ๋ฉดTrue
๋ฅผ ๋ฐํํ๊ณ , ๊ทธ๋ ์ง ์์ผ๋ฉดFalse
๋ฅผ ๋ฐํํฉ๋๋ค.
์ค์ ์ ๊ธ ์: ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ก์ธ์ค
์ ๊ธ์ ๋น๋๊ธฐ ํ๊ฒฝ์์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ก์ธ์ค๋ฅผ ์ฒ๋ฆฌํ ๋ ํนํ ์ ์ฉํฉ๋๋ค. ์ฌ๋ฌ ์ฝ๋ฃจํด์ด ๋์์ ๋์ผํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ ์ด๋ธ์ ์ฐ๋ ค๊ณ ์๋ํ์ฌ ๋ฐ์ดํฐ ์์ ๋๋ ๋ถ์ผ์น๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค. ์ ๊ธ์ ์ฌ์ฉํ์ฌ ์ด๋ฌํ ์ฐ๊ธฐ ์์ ์ ์ง๋ ฌํํ์ฌ ํ ๋ฒ์ ํ๋์ ์ฝ๋ฃจํด๋ง ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์์ ํ๋๋ก ํ ์ ์์ต๋๋ค.
์๋ฅผ ๋ค์ด ์ฌ๋ฌ ์ฌ์ฉ์๊ฐ ๋์์ ์ ํ์ ์ฌ๊ณ ๋ฅผ ์ ๋ฐ์ดํธํ๋ ค๊ณ ์๋ํ ์ ์๋ ์ ์ ์๊ฑฐ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์๊ฐํด ๋ณด์ญ์์ค. ์ ๊ธ์ ์ฌ์ฉํ๋ฉด ์ฌ๊ณ ๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ์ ๋ฐ์ดํธ๋์ด ๊ณผ๋ค ํ๋งค๋ฅผ ๋ฐฉ์งํ ์ ์์ต๋๋ค. ์ ๊ธ์ ํ์ฌ ์ฌ๊ณ ์์ค์ ์ฝ๊ธฐ ์ ์ ํ๋๋๊ณ ๊ตฌ๋งคํ ํญ๋ชฉ ์๋งํผ ๊ฐ์๋ ๋ค์ ์ ์ฌ๊ณ ์์ค์ผ๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ ๋ฐ์ดํธํ ํ ํด์ ๋ฉ๋๋ค. ์ด๋ ๋คํธ์ํฌ ๋๊ธฐ ์๊ฐ์ด ๊ฒฝ์ ์กฐ๊ฑด์ ์ ํ์ํฌ ์ ์๋ ๋ถ์ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋๋ ํด๋ผ์ฐ๋ ๊ธฐ๋ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์๋น์ค๋ฅผ ์ฒ๋ฆฌํ ๋ ํนํ ์ค์ํฉ๋๋ค.
Asyncio ์ธ๋งํฌ์ด
asyncio.Semaphore
๋ ์ ๊ธ๋ณด๋ค ๋ ์ผ๋ฐ์ ์ธ ๋๊ธฐํ ๊ธฐ๋ณธ ์์์
๋๋ค. ์ฌ์ฉ ๊ฐ๋ฅํ ๋ฆฌ์์ค ์๋ฅผ ๋ํ๋ด๋ ๋ด๋ถ ์นด์ดํฐ๋ฅผ ์ ์ง ๊ด๋ฆฌํฉ๋๋ค. ์ฝ๋ฃจํด์ ์ธ๋งํฌ์ด๋ฅผ ํ๋ํ์ฌ ์นด์ดํฐ๋ฅผ ๊ฐ์์ํค๊ณ ํด์ ํ์ฌ ์นด์ดํฐ๋ฅผ ์ฆ๊ฐ์ํฌ ์ ์์ต๋๋ค. ์นด์ดํฐ๊ฐ 0์ ๋๋ฌํ๋ฉด ํ๋ ์ด์์ ์ฝ๋ฃจํด์ด ์ธ๋งํฌ์ด๋ฅผ ํด์ ํ ๋๊น์ง ๋ ์ด์ ์ฝ๋ฃจํด์ด ์ธ๋งํฌ์ด๋ฅผ ํ๋ํ ์ ์์ต๋๋ค.
์ธ๋งํฌ์ด ์๋ ๋ฐฉ์
์ธ๋งํฌ์ด์๋ ๋ฆฌ์์ค์ ํ์ฉ๋๋ ์ต๋ ๋์ ์ก์ธ์ค ์๋ฅผ ๋ํ๋ด๋ ์ด๊ธฐ ๊ฐ์ด ์์ต๋๋ค. ์ฝ๋ฃจํด์ด acquire()
๋ฅผ ํธ์ถํ๋ฉด ์ธ๋งํฌ์ด์ ์นด์ดํฐ๊ฐ ๊ฐ์๋ฉ๋๋ค. ์นด์ดํฐ๊ฐ 0๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ์ผ๋ฉด ์ฝ๋ฃจํด์ด ์ฆ์ ์งํ๋ฉ๋๋ค. ์นด์ดํฐ๊ฐ ์์์ด๋ฉด ๋ค๋ฅธ ์ฝ๋ฃจํด์ด ์ธ๋งํฌ์ด๋ฅผ ํด์ ํ์ฌ ์นด์ดํฐ๋ฅผ ์ฆ๊ฐ์ํค๊ณ ๋๊ธฐ ์ค์ธ ์ฝ๋ฃจํด์ด ์งํ๋ ์ ์์ ๋๊น์ง ์ฝ๋ฃจํด์ด ์ฐจ๋จ๋ฉ๋๋ค. release()
๋ฉ์๋๋ ์นด์ดํฐ๋ฅผ ์ฆ๊ฐ์ํต๋๋ค.
Asyncio ์ธ๋งํฌ์ด ์ฌ์ฉ
๋ค์์ asyncio.Semaphore
์ฌ์ฉ์ ๋ณด์ฌ์ฃผ๋ ์์
๋๋ค.
import asyncio
async def worker(semaphore, worker_id):
async with semaphore:
print(f"Worker {worker_id} acquiring resource...")
await asyncio.sleep(1) # Simulate resource usage
print(f"Worker {worker_id} releasing resource...")
async def main():
semaphore = asyncio.Semaphore(3) # Allow up to 3 concurrent workers
tasks = [worker(semaphore, i) for i in range(5)]
await asyncio.gather(*tasks)
if __name__ == "__main__":
asyncio.run(main())
์ด ์์์ Semaphore
๋ ๊ฐ์ด 3์ผ๋ก ์ด๊ธฐํ๋์ด ์ต๋ 3๋ช
์ ์์
์๊ฐ ๋์์ ๋ฆฌ์์ค์ ์ก์ธ์คํ ์ ์๋๋ก ํฉ๋๋ค. async with semaphore:
๋ฌธ์ ์์
์๊ฐ ์์ํ๊ธฐ ์ ์ ์ธ๋งํฌ์ด๊ฐ ํ๋๋๊ณ ์์ธ๊ฐ ๋ฐ์ํ๋๋ผ๋ ์๋ฃ๋๋ฉด ํด์ ๋๋๋ก ํฉ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ๋์ ์์
์ ์๊ฐ ์ ํ๋์ด ๋ฆฌ์์ค ๊ณ ๊ฐ์ ๋ฐฉ์งํ ์ ์์ต๋๋ค.
์ธ๋งํฌ์ด ๋ฉ์๋
acquire()
: ๋ด๋ถ ์นด์ดํฐ๋ฅผ 1์ฉ ๊ฐ์์ํต๋๋ค. ์นด์ดํฐ๊ฐ ์์๊ฐ ์๋๋ฉด ์ฝ๋ฃจํด์ด ์ฆ์ ์งํ๋ฉ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ๋ค๋ฅธ ์ฝ๋ฃจํด์ด ์ธ๋งํฌ์ด๋ฅผ ํด์ ํ ๋๊น์ง ์ฝ๋ฃจํด์ด ๊ธฐ๋ค๋ฆฝ๋๋ค. ์ธ๋งํฌ์ด๊ฐ ํ๋๋๋ฉดTrue
๋ฅผ ๋ฐํํ๊ณ , ์๊ฐ ์ด๊ณผ๊ฐ ์ง์ ๋์๊ณ ์๊ฐ ์ด๊ณผ ๋ด์ ์ธ๋งํฌ์ด๋ฅผ ํ๋ํ ์ ์์ผ๋ฉดFalse
๋ฅผ ๋ฐํํฉ๋๋ค.release()
: ๋ด๋ถ ์นด์ดํฐ๋ฅผ 1์ฉ ์ฆ๊ฐ์์ผ ๋๊ธฐ ์ค์ธ ์ฝ๋ฃจํด์ ๊นจ์ธ ์ ์์ต๋๋ค.locked()
: ์ธ๋งํฌ์ด๊ฐ ํ์ฌ ์ ๊ธด ์ํ(์นด์ดํฐ๊ฐ 0 ๋๋ ์์)์ด๋ฉดTrue
๋ฅผ ๋ฐํํ๊ณ , ๊ทธ๋ ์ง ์์ผ๋ฉดFalse
๋ฅผ ๋ฐํํฉ๋๋ค.value
: ๋ด๋ถ ์นด์ดํฐ์ ํ์ฌ ๊ฐ์ ๋ฐํํ๋ ์ฝ๊ธฐ ์ ์ฉ ์์ฑ์ ๋๋ค.
์ค์ ์ธ๋งํฌ์ด ์: ์๋ ์ ํ
์ธ๋งํฌ์ด๋ ์๋ ์ ํ์ ๊ตฌํํ๋ ๋ฐ ํนํ ์ ํฉํฉ๋๋ค. ์ธ๋ถ API์ ์์ฒญํ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์์ํด ๋ณด์ญ์์ค. API ์๋ฒ์ ๊ณผ๋ถํ๊ฐ ๊ฑธ๋ฆฌ์ง ์๋๋ก ๋จ์ ์๊ฐ๋น ์ ์ก๋๋ ์์ฒญ ์๋ฅผ ์ ํํ๋ ๊ฒ์ด ํ์์ ์ ๋๋ค. ์ธ๋งํฌ์ด๋ฅผ ์ฌ์ฉํ์ฌ ์์ฒญ ์๋๋ฅผ ์ ์ดํ ์ ์์ต๋๋ค.
์๋ฅผ ๋ค์ด ์ธ๋งํฌ์ด๋ฅผ ์ด๋น ํ์ฉ๋๋ ์ต๋ ์์ฒญ ์๋ฅผ ๋ํ๋ด๋ ๊ฐ์ผ๋ก ์ด๊ธฐํํ ์ ์์ต๋๋ค. ์์ฒญ์ ํ๊ธฐ ์ ์ ์ฝ๋ฃจํด์ ์ธ๋งํฌ์ด๋ฅผ ํ๋ํฉ๋๋ค. ์ธ๋งํฌ์ด๋ฅผ ์ฌ์ฉํ ์ ์๋ ๊ฒฝ์ฐ(์นด์ดํฐ๊ฐ 0๋ณด๋ค ํผ) ์์ฒญ์ด ์ ์ก๋ฉ๋๋ค. ์ธ๋งํฌ์ด๋ฅผ ์ฌ์ฉํ ์ ์๋ ๊ฒฝ์ฐ(์นด์ดํฐ๊ฐ 0) ๋ค๋ฅธ ์ฝ๋ฃจํด์ด ์ธ๋งํฌ์ด๋ฅผ ํด์ ํ ๋๊น์ง ์ฝ๋ฃจํด์ด ๊ธฐ๋ค๋ฆฝ๋๋ค. ๋ฐฑ๊ทธ๋ผ์ด๋ ์์ ์ ์ธ๋งํฌ์ด๋ฅผ ์ฃผ๊ธฐ์ ์ผ๋ก ํด์ ํ์ฌ ์ฌ์ฉ ๊ฐ๋ฅํ ์์ฒญ์ ๋ณด์ถฉํ์ฌ ํจ๊ณผ์ ์ผ๋ก ์๋ ์ ํ์ ๊ตฌํํ ์ ์์ต๋๋ค. ์ด๋ ์ ์ธ๊ณ์ ๋ง์ ํด๋ผ์ฐ๋ ์๋น์ค ๋ฐ ๋ง์ดํฌ๋ก์๋น์ค ์ํคํ ์ฒ์์ ์ฌ์ฉ๋๋ ์ผ๋ฐ์ ์ธ ๊ธฐ์ ์ ๋๋ค.
Asyncio ์ด๋ฒคํธ
asyncio.Event
๋ ์ฝ๋ฃจํด์ด ํน์ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ ๋๊น์ง ๊ธฐ๋ค๋ฆด ์ ์๋๋ก ํ๋ ๊ฐ๋จํ ๋๊ธฐํ ๊ธฐ๋ณธ ์์์
๋๋ค. ์ค์ ๋จ ๋ฐ ์ค์ ํด์ ์ ๋ ๊ฐ์ง ์ํ๊ฐ ์์ต๋๋ค. ์ฝ๋ฃจํด์ ์ด๋ฒคํธ๊ฐ ์ค์ ๋ ๋๊น์ง ๊ธฐ๋ค๋ฆด ์ ์์ผ๋ฉฐ ์ด๋ฒคํธ๋ฅผ ์ค์ ํ๊ฑฐ๋ ์ง์ธ ์ ์์ต๋๋ค.
์ด๋ฒคํธ ์๋ ๋ฐฉ์
์ด๋ฒคํธ๋ ์ค์ ํด์ ์ํ๋ก ์์๋ฉ๋๋ค. ์ฝ๋ฃจํด์ wait()
๋ฅผ ํธ์ถํ์ฌ ์ด๋ฒคํธ๊ฐ ์ค์ ๋ ๋๊น์ง ์คํ์ ์ผ์ ์ค๋จํ ์ ์์ต๋๋ค. ๋ค๋ฅธ ์ฝ๋ฃจํด์ด set()
์ ํธ์ถํ๋ฉด ๋๊ธฐ ์ค์ธ ๋ชจ๋ ์ฝ๋ฃจํด์ด ๊นจ์ด๋ ์งํํ ์ ์์ต๋๋ค. clear()
๋ฉ์๋๋ ์ด๋ฒคํธ๋ฅผ ์ค์ ํด์ ์ํ๋ก ์ฌ์ค์ ํฉ๋๋ค.
Asyncio ์ด๋ฒคํธ ์ฌ์ฉ
๋ค์์ asyncio.Event
์ฌ์ฉ์ ๋ณด์ฌ์ฃผ๋ ์์
๋๋ค.
import asyncio
async def waiter(event, waiter_id):
print(f"Waiter {waiter_id} waiting for event...")
await event.wait()
print(f"Waiter {waiter_id} received event!")
async def main():
event = asyncio.Event()
tasks = [waiter(event, i) for i in range(3)]
await asyncio.sleep(1)
print("Setting event...")
event.set()
await asyncio.gather(*tasks)
if __name__ == "__main__":
asyncio.run(main())
์ด ์์์ ์ธ ๊ฐ์ ๋๊ธฐ์๊ฐ ์์ฑ๋๊ณ ์ด๋ฒคํธ๊ฐ ์ค์ ๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฝ๋๋ค. 1์ด ์ง์ฐ ํ ๊ธฐ๋ณธ ์ฝ๋ฃจํด์ด ์ด๋ฒคํธ๋ฅผ ์ค์ ํฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ ๋๊ธฐ ์ค์ธ ๋ชจ๋ ์ฝ๋ฃจํด์ด ๊นจ์ด๋ ์งํํฉ๋๋ค.
์ด๋ฒคํธ ๋ฉ์๋
wait()
: ์ด๋ฒคํธ๊ฐ ์ค์ ๋ ๋๊น์ง ์คํ์ ์ผ์ ์ค๋จํฉ๋๋ค. ์ด๋ฒคํธ๊ฐ ์ค์ ๋๋ฉดTrue
๋ฅผ ๋ฐํํฉ๋๋ค.set()
: ์ด๋ฒคํธ๋ฅผ ์ค์ ํ์ฌ ๋๊ธฐ ์ค์ธ ๋ชจ๋ ์ฝ๋ฃจํด์ ๊นจ์๋๋ค.clear()
: ์ด๋ฒคํธ๋ฅผ ์ค์ ํด์ ์ํ๋ก ์ฌ์ค์ ํฉ๋๋ค.is_set()
: ์ด๋ฒคํธ๊ฐ ํ์ฌ ์ค์ ๋์ด ์์ผ๋ฉดTrue
๋ฅผ ๋ฐํํ๊ณ , ๊ทธ๋ ์ง ์์ผ๋ฉดFalse
๋ฅผ ๋ฐํํฉ๋๋ค.
์ค์ ์ด๋ฒคํธ ์: ๋น๋๊ธฐ ์์ ์๋ฃ
์ด๋ฒคํธ๋ ๋น๋๊ธฐ ์์ ์ ์๋ฃ๋ฅผ ์๋ฆฌ๋ ๋ฐ ์์ฃผ ์ฌ์ฉ๋ฉ๋๋ค. ๊ธฐ๋ณธ ์ฝ๋ฃจํด์ด ์งํํ๊ธฐ ์ ์ ๋ฐฑ๊ทธ๋ผ์ด๋ ์์ ์ด ์๋ฃ๋ ๋๊น์ง ๊ธฐ๋ค๋ ค์ผ ํ๋ ์๋๋ฆฌ์ค๋ฅผ ์์ํด ๋ณด์ญ์์ค. ๋ฐฑ๊ทธ๋ผ์ด๋ ์์ ์ ์๋ฃ๋๋ฉด ์ด๋ฒคํธ๋ฅผ ์ค์ ํ์ฌ ๊ณ์ํ ์ ์์์ ๊ธฐ๋ณธ ์ฝ๋ฃจํด์ ์๋ฆด ์ ์์ต๋๋ค.
์ฌ๋ฌ ๋จ๊ณ๋ฅผ ์์๋๋ก ์คํํด์ผ ํ๋ ๋ฐ์ดํฐ ์ฒ๋ฆฌ ํ์ดํ๋ผ์ธ์ ์๊ฐํด ๋ณด์ญ์์ค. ๊ฐ ๋จ๊ณ๋ฅผ ๋ณ๋์ ์ฝ๋ฃจํด์ผ๋ก ๊ตฌํํ ์ ์์ผ๋ฉฐ, ๊ฐ ๋จ๊ณ์ ์๋ฃ๋ฅผ ์๋ฆฌ๊ธฐ ์ํด ์ด๋ฒคํธ๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๋ค์ ๋จ๊ณ๋ ์คํ์ ์์ํ๊ธฐ ์ ์ ์ด์ ๋จ๊ณ์ ์ด๋ฒคํธ๊ฐ ์ค์ ๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฝ๋๋ค. ์ด๋ฅผ ํตํด ๋ชจ๋์ ๋น๋๊ธฐ ๋ฐ์ดํฐ ์ฒ๋ฆฌ ํ์ดํ๋ผ์ธ์ด ๊ฐ๋ฅํฉ๋๋ค. ์ด๋ฌํ ํจํด์ ์ ์ธ๊ณ ๋ฐ์ดํฐ ์์ง๋์ด๊ฐ ์ฌ์ฉํ๋ ETL(์ถ์ถ, ๋ณํ, ๋ก๋) ํ๋ก์ธ์ค์์ ๋งค์ฐ ์ค์ํฉ๋๋ค.
์ฌ๋ฐ๋ฅธ ๋๊ธฐํ ๊ธฐ๋ณธ ์์ ์ ํ
์ ์ ํ ๋๊ธฐํ ๊ธฐ๋ณธ ์์ ์ ํ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ํน์ ์๊ตฌ ์ฌํญ์ ๋ฐ๋ผ ๋ค๋ฆ ๋๋ค.
- ์ ๊ธ: ๊ณต์ ๋ฆฌ์์ค์ ๋ํ ๋ฐฐํ์ ์ก์ธ์ค๋ฅผ ๋ณด์ฅํด์ผ ํ ๋ ์ ๊ธ์ ์ฌ์ฉํ์ญ์์ค. ํ ๋ฒ์ ํ๋์ ์ฝ๋ฃจํด๋ง ์ก์ธ์คํ ์ ์๋๋ก ํ์ฉํฉ๋๋ค. ๊ณต์ ์ํ๋ฅผ ์์ ํ๋ ์ฝ๋์ ์ค์ํ ์น์ ์ ๋ณดํธํ๋ ๋ฐ ์ ํฉํฉ๋๋ค.
- ์ธ๋งํฌ์ด: ๋ฆฌ์์ค์ ๋ํ ๋์ ์ก์ธ์ค ์๋ฅผ ์ ํํ๊ฑฐ๋ ์๋ ์ ํ์ ๊ตฌํํด์ผ ํ ๋ ์ธ๋งํฌ์ด๋ฅผ ์ฌ์ฉํ์ญ์์ค. ๋ฆฌ์์ค ์ฌ์ฉ๋์ ์ ์ดํ๊ณ ๊ณผ๋ถํ๋ฅผ ๋ฐฉ์งํ๋ ๋ฐ ์ ์ฉํฉ๋๋ค.
- ์ด๋ฒคํธ: ํน์ ์ด๋ฒคํธ์ ๋ฐ์์ ์๋ฆฌ๊ณ ์ฌ๋ฌ ์ฝ๋ฃจํด์ด ํด๋น ์ด๋ฒคํธ๋ฅผ ๊ธฐ๋ค๋ฆด ์ ์๋๋ก ํด์ผ ํ ๋ ์ด๋ฒคํธ๋ฅผ ์ฌ์ฉํ์ญ์์ค. ๋น๋๊ธฐ ์์ ์ ์กฐ์ ํ๊ณ ์์ ์๋ฃ๋ฅผ ์๋ฆฌ๋ ๋ฐ ์ ํฉํฉ๋๋ค.
์ฌ๋ฌ ๋๊ธฐํ ๊ธฐ๋ณธ ์์๋ฅผ ์ฌ์ฉํ ๋ ๊ต์ฐฉ ์ํ์ ๊ฐ๋ฅ์ฑ์ ๊ณ ๋ คํ๋ ๊ฒ๋ ์ค์ํฉ๋๋ค. ๊ต์ฐฉ ์ํ๋ ๋ ์ด์์ ์ฝ๋ฃจํด์ด ๋ฆฌ์์ค ํด์ ๋ฅผ ์๋ก ๊ธฐ๋ค๋ฆฌ๋ฉด์ ๋ฌด๊ธฐํ ์ฐจ๋จ๋ ๋ ๋ฐ์ํฉ๋๋ค. ๊ต์ฐฉ ์ํ๋ฅผ ๋ฐฉ์งํ๋ ค๋ฉด ์ ๊ธ ๋ฐ ์ธ๋งํฌ์ด๋ฅผ ์ผ๊ด๋ ์์๋ก ํ๋ํ๊ณ ์ฅ๊ธฐ๊ฐ ๋ณด์ ํ์ง ์๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
๊ณ ๊ธ ๋๊ธฐํ ๊ธฐ์
๊ธฐ๋ณธ ๋๊ธฐํ ๊ธฐ๋ณธ ์์ ์ธ์๋ asyncio
๋ ๋์์ฑ์ ๊ด๋ฆฌํ๊ธฐ ์ํ ๊ณ ๊ธ ๊ธฐ์ ์ ์ ๊ณตํฉ๋๋ค.
- ํ:
asyncio.Queue
๋ ์ฝ๋ฃจํด ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๊ธฐ ์ํ ์ค๋ ๋ ์์ ๋ฐ ์ฝ๋ฃจํด ์์ ํ๋ฅผ ์ ๊ณตํฉ๋๋ค. ์์ฐ์-์๋น์ ํจํด์ ๊ตฌํํ๊ณ ๋น๋๊ธฐ ๋ฐ์ดํฐ ์คํธ๋ฆผ์ ๊ด๋ฆฌํ๋ ๋ฐ ์ ์ฉํ ๊ฐ๋ ฅํ ๋๊ตฌ์ ๋๋ค. - ์กฐ๊ฑด:
asyncio.Condition
์ ์ฌ์ฉํ๋ฉด ์ฝ๋ฃจํด์ด ์งํํ๊ธฐ ์ ์ ํน์ ์กฐ๊ฑด์ด ์ถฉ์กฑ๋ ๋๊น์ง ๊ธฐ๋ค๋ฆด ์ ์์ต๋๋ค. ์ ๊ธ๊ณผ ์ด๋ฒคํธ์ ๊ธฐ๋ฅ์ ๊ฒฐํฉํ์ฌ ๋ณด๋ค ์ ์ฐํ ๋๊ธฐํ ๋ฉ์ปค๋์ฆ์ ์ ๊ณตํฉ๋๋ค.
Asyncio ๋๊ธฐํ๋ฅผ ์ํ ๋ชจ๋ฒ ์ฌ๋ก
๋ค์์ asyncio
๋๊ธฐํ ๊ธฐ๋ณธ ์์๋ฅผ ์ฌ์ฉํ ๋ ๋ฐ๋ผ์ผ ํ ๋ชจ๋ฒ ์ฌ๋ก์
๋๋ค.
- ์ค์ ์น์ ์ต์ํ: ๊ฒฝํฉ์ ์ค์ด๊ณ ์ฑ๋ฅ์ ํฅ์์ํค๊ธฐ ์ํด ์ค์ํ ์น์ ๋ด์ ์ฝ๋๋ฅผ ์ต๋ํ ์งง๊ฒ ์ ์งํ์ญ์์ค.
- ์ปจํ
์คํธ ๊ด๋ฆฌ์ ์ฌ์ฉ:
async with
๋ฌธ์ ์ฌ์ฉํ์ฌ ์ ๊ธ ๋ฐ ์ธ๋งํฌ์ด๋ฅผ ์๋์ผ๋ก ํ๋ํ๊ณ ํด์ ํ์ฌ ์์ธ๊ฐ ๋ฐ์ํ๋๋ผ๋ ํญ์ ํด์ ๋๋๋ก ํ์ญ์์ค. - ์ฐจ๋จ ์์ ๋ฐฉ์ง: ์ค์ํ ์น์ ๋ด์์ ์ฐจ๋จ ์์ ์ ์ํํ์ง ๋ง์ญ์์ค. ์ฐจ๋จ ์์ ์ ๋ค๋ฅธ ์ฝ๋ฃจํด์ด ์ ๊ธ์ ํ๋ํ์ง ๋ชปํ๊ฒ ํ๊ณ ์ฑ๋ฅ ์ ํ๋ฅผ ์ด๋ํ ์ ์์ต๋๋ค.
- ์๊ฐ ์ด๊ณผ ๊ณ ๋ ค: ์ค๋ฅ ๋๋ ๋ฆฌ์์ค๋ฅผ ์ฌ์ฉํ ์ ์๋ ๊ฒฝ์ฐ ๋ฌด๊ธฐํ ์ฐจ๋จ์ ๋ฐฉ์งํ๊ธฐ ์ํด ์ ๊ธ ๋ฐ ์ธ๋งํฌ์ด๋ฅผ ํ๋ํ ๋ ์๊ฐ ์ด๊ณผ๋ฅผ ์ฌ์ฉํ์ญ์์ค.
- ์ฒ ์ ํ ํ ์คํธ: ๋น๋๊ธฐ ์ฝ๋๋ฅผ ์ฒ ์ ํ ํ ์คํธํ์ฌ ๊ฒฝ์ ์กฐ๊ฑด ๋ฐ ๊ต์ฐฉ ์ํ๊ฐ ์๋์ง ํ์ธํ์ญ์์ค. ๋์์ฑ ํ ์คํธ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ํ์ค์ ์ธ ์ํฌ๋ก๋๋ฅผ ์๋ฎฌ๋ ์ด์ ํ๊ณ ์ ์ฌ์ ์ธ ๋ฌธ์ ๋ฅผ ์๋ณํ์ญ์์ค.
๊ฒฐ๋ก
asyncio
๋๊ธฐํ ๊ธฐ๋ณธ ์์๋ฅผ ๋ง์คํฐํ๋ ๊ฒ์ Python์์ ๊ฐ๋ ฅํ๊ณ ํจ์จ์ ์ธ ๋น๋๊ธฐ ์ ํ๋ฆฌ์ผ์ด์
์ ๊ตฌ์ถํ๋ ๋ฐ ํ์์ ์
๋๋ค. ์ ๊ธ, ์ธ๋งํฌ์ด ๋ฐ ์ด๋ฒคํธ์ ๋ชฉ์ ๊ณผ ์ฌ์ฉ๋ฒ์ ์ดํดํจ์ผ๋ก์จ ๊ณต์ ๋ฆฌ์์ค์ ๋ํ ์ก์ธ์ค๋ฅผ ํจ๊ณผ์ ์ผ๋ก ์กฐ์ ํ๊ณ ๊ฒฝ์ ์กฐ๊ฑด์ ๋ฐฉ์งํ๋ฉฐ ๋์ ํ๋ก๊ทธ๋จ์์ ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ์ ๋ณด์ฅํ ์ ์์ต๋๋ค. ํน์ ์๊ตฌ ์ฌํญ์ ๋ง๋ ์ฌ๋ฐ๋ฅธ ๋๊ธฐํ ๊ธฐ๋ณธ ์์๋ฅผ ์ ํํ๊ณ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๋ฐ๋ฅด๊ณ ์ผ๋ฐ์ ์ธ ํจ์ ์ ํผํ๊ธฐ ์ํด ์ฝ๋๋ฅผ ์ฒ ์ ํ ํ
์คํธํ์ญ์์ค. ๋น๋๊ธฐ ํ๋ก๊ทธ๋๋ฐ ์ธ๊ณ๋ ์ง์์ ์ผ๋ก ์งํํ๊ณ ์์ผ๋ฏ๋ก ํ์ฅ ๊ฐ๋ฅํ๊ณ ์ฑ๋ฅ์ด ๋ฐ์ด๋ ์ ํ๋ฆฌ์ผ์ด์
์ ๊ตฌ์ถํ๋ ค๋ฉด ์ต์ ๊ธฐ๋ฅ๊ณผ ๊ธฐ์ ์ ์ต์ ์ํ๋ก ์ ์งํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ์ ์ญ ํ๋ซํผ์ด ๋์์ฑ์ ๊ด๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ์ดํดํ๋ ๊ฒ์ ์ ์ธ๊ณ์ ์ผ๋ก ํจ์จ์ ์ผ๋ก ์๋ํ ์ ์๋ ์๋ฃจ์
์ ๊ตฌ์ถํ๋ ๋ฐ ๋งค์ฐ ์ค์ํฉ๋๋ค.